using System;
using System.Collections;
using System.Data;
using BeeldBank.Business;
using BeeldBank.Business.Collection;

namespace BeeldBank.Business.Base
{
    /// <summary>
    /// Provides database independant methods for ZoekActieLog.
    /// </summary>
    public class ZoekActieLogBase : BusinessBase
    {
        internal ZoekActieLogBase(System.Data.DataRow row)
            : base(row)
        {
            this.OnPrepareForSave += new PrepareForSaveHandler(this.PrepareForSave);
        }

        public delegate void PrepareForSaveHandler();
        public event PrepareForSaveHandler OnPrepareForSave;

        #region property bool EnforceSave
        /// This property is used to indicate if the
        /// object in the save event should save, even
        /// if the object contents (marked as stereotype NOTENFORCESAVE) is not saved
        private bool _EnforceSave = false;
        public bool EnforceSave
        {
            get
            {
                return _EnforceSave;
            }
            set
            {
                _EnforceSave = value;
            }

        }
        #endregion

        #region PrepareForSaveBase()
        public void PrepareForSaveBase()
        {
            if (!this.PrepareForSaveFinished)
            {
                if (OnPrepareForSave != null)
                {
                    OnPrepareForSave();
                }
                this.CanLoad = false;
                // call prepareforsave on all dependant objects.
                if (this.Gebruikers != null)
                {
                    this.Gebruikers.PrepareForSaveBase();
                }

                this.CanLoad = true;
                this.PrepareForSaveFinished = true;
            }
        }
        #endregion

        #region PrepareForSave()
        public virtual void PrepareForSave()
        {
        }
        #endregion

        #region PreSave()
        public virtual void PreSave()
        {
        }
        #endregion

        #region Save()
        public void Save()
        {
            bool IsSaveNeeded = ContentChanged();

            if (IsDirty)
            {
                this.ModifiedBy = _luw.UserName;
                if (this.State == BusinessState.New)
                {
                    this.CreatedBy = _luw.UserName;
                    if (this.Gebruikers != null)
                    {
                        this.Gebruikers.Save();
                    }
                    BeeldBank.Data.ZoekActieLog.Insert(this._dataRow, _luw.Transaction);

                }

                if ((this.State == BusinessState.Changed) && (IsSaveNeeded))
                {
                    BeeldBank.Data.ZoekActieLog.Update(this._dataRow, _luw.Transaction);
                }

                if (this.State == BusinessState.Deleted)
                {
                    BeeldBank.Data.ZoekActieLog.Delete(this._dataRow, _luw.Transaction);
                    if (this.Gebruikers != null)
                    {
                        this.Gebruikers.Save();
                    }

                }
                IsDirty = false;
            }
        }
        #endregion

        #region OldZoekActieLog
        private ZoekActieLog _oldZoekActieLog;
        public ZoekActieLog OldZoekActieLog
        {
            get
            {
                if (_oldZoekActieLog == null && this.State != BusinessState.New)
                {
                    // Create the new object in a completely separate luw,
                    // otherwise a reference the the current object is returned.
                    Luw luw = new Luw(this.Luw.UserName);
                    _oldZoekActieLog = luw.NewZoekActieLog(BeeldBank.Data.ZoekActieLog.Open(this.Id).Rows[0]);
                }
                return _oldZoekActieLog;
            }
        }
        #endregion

        #region Id
        /// <summary>
        /// Primaire sleutel
        /// </summary>
        public int Id
        {
            get
            {
                return Convert.ToInt32(_dataRow["Id"]);
            }
            set
            {
                _dataRow["Id"] = value;
                this.IsDirty = true;
            }
        }
        public bool IdIsNull
        {
            get
            {
                return _dataRow["Id"] == Convert.DBNull;
            }
        }
        public void IdSetNull()
        {
            _dataRow["Id"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region UserId
        /// <summary>
        /// Vreemde sleutel naar de gebruikerstabel
        /// </summary>
        public int UserId
        {
            get
            {
                return Convert.ToInt32(_dataRow["UserId"]);
            }
            set
            {
                _dataRow["UserId"] = value;
                this.IsDirty = true;
            }
        }
        public bool UserIdIsNull
        {
            get
            {
                return _dataRow["UserId"] == Convert.DBNull;
            }
        }
        public void UserIdSetNull()
        {
            _dataRow["UserId"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region ZoekDatum
        /// <summary>
        /// De datum waarop het zoekstatement is uitgevoerd
        /// </summary>
        public DateTime ZoekDatum
        {
            get
            {
                return Convert.ToDateTime(_dataRow["ZoekDatum"]);
            }
            set
            {
                _dataRow["ZoekDatum"] = value;
                this.IsDirty = true;
            }
        }
        public bool ZoekDatumIsNull
        {
            get
            {
                return _dataRow["ZoekDatum"] == Convert.DBNull;
            }
        }
        public void ZoekDatumSetNull()
        {
            _dataRow["ZoekDatum"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region ZoekType
        /// <summary>
        /// Type zoek opdracht
        /// </summary>
        public string ZoekType
        {
            get
            {
                return Convert.ToString(_dataRow["ZoekType"]);
            }
            set
            {
                _dataRow["ZoekType"] = value;
                this.IsDirty = true;
            }
        }
        public bool ZoekTypeIsNull
        {
            get
            {
                return _dataRow["ZoekType"] == Convert.DBNull;
            }
        }
        public void ZoekTypeSetNull()
        {
            _dataRow["ZoekType"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region ZoekThema
        /// <summary>
        /// Thema zoek opdracht
        /// </summary>
        public string ZoekThema
        {
            get
            {
                return Convert.ToString(_dataRow["ZoekThema"]);
            }
            set
            {
                _dataRow["ZoekThema"] = value;
                this.IsDirty = true;
            }
        }
        public bool ZoekThemaIsNull
        {
            get
            {
                return _dataRow["ZoekThema"] == Convert.DBNull;
            }
        }
        public void ZoekThemaSetNull()
        {
            _dataRow["ZoekThema"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region AantalResultaten
        /// <summary>
        /// Het aantal resultaten dat terug gegeven wordt.
        /// </summary>
        public int AantalResultaten
        {
            get
            {
                return Convert.ToInt32(_dataRow["AantalResultaten"]);
            }
            set
            {
                _dataRow["AantalResultaten"] = value;
                this.IsDirty = true;
            }
        }
        public bool AantalResultatenIsNull
        {
            get
            {
                return _dataRow["AantalResultaten"] == Convert.DBNull;
            }
        }
        public void AantalResultatenSetNull()
        {
            _dataRow["AantalResultaten"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region Begindatum
        /// <summary>
        /// De begin datum van een periode waarin gezocht wordt.
        /// </summary>
        public bool Begindatum
        {
            get
            {
                return (_dataRow["Begindatum"] == Convert.DBNull) ? false : Convert.ToBoolean(_dataRow["Begindatum"]);
            }
            set
            {
                _dataRow["Begindatum"] = value;
                this.IsDirty = true;
            }
        }
        public bool BegindatumIsNull
        {
            get
            {
                return _dataRow["Begindatum"] == Convert.DBNull;
            }
        }
        public void BegindatumSetNull()
        {
            _dataRow["Begindatum"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region Einddatum
        /// <summary>
        /// De einddatum van een periode waarin gezocht wordt.
        /// </summary>
        public bool Einddatum
        {
            get
            {
                return (_dataRow["Einddatum"] == Convert.DBNull) ? false : Convert.ToBoolean(_dataRow["Einddatum"]);
            }
            set
            {
                _dataRow["Einddatum"] = value;
                this.IsDirty = true;
            }
        }
        public bool EinddatumIsNull
        {
            get
            {
                return _dataRow["Einddatum"] == Convert.DBNull;
            }
        }
        public void EinddatumSetNull()
        {
            _dataRow["Einddatum"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region Criteria
        /// <summary>
        /// De criteria waarmee gezocht wordt.
        /// </summary>
        public string Criteria
        {
            get
            {
                return (_dataRow["Criteria"] == Convert.DBNull) ? "" : Convert.ToString(_dataRow["Criteria"]);
            }
            set
            {
                _dataRow["Criteria"] = value;
                this.IsDirty = true;
            }
        }
        public bool CriteriaIsNull
        {
            get
            {
                return _dataRow["Criteria"] == Convert.DBNull;
            }
        }
        public void CriteriaSetNull()
        {
            _dataRow["Criteria"] = Convert.DBNull;
            this.IsDirty = true;
        }
        #endregion

        #region CreatedBy
        public String CreatedBy
        {
            get
            {
                return Convert.ToString(_dataRow["CreatedBy"]);
            }
            set
            {
                _dataRow["CreatedBy"] = value;
                this.IsDirty = true;
            }
        }
        #endregion

        #region CreatedAt
        public DateTime CreatedAt
        {
            get
            {
                return Convert.ToDateTime(_dataRow["CreatedAt"]);
            }
            set
            {
                _dataRow["CreatedAt"] = value;
                this.IsDirty = true;
            }
        }
        #endregion

        #region ModifiedBy
        public String ModifiedBy
        {
            get
            {
                return Convert.ToString(_dataRow["ModifiedBy"]);
            }
            set
            {
                _dataRow["ModifiedBy"] = value;
                this.IsDirty = true;
            }
        }
        #endregion

        #region ModifiedAt
        public DateTime ModifiedAt
        {
            get
            {
                return Convert.ToDateTime(_dataRow["ModifiedAt"]);
            }
            set
            {
                _dataRow["ModifiedAt"] = value;
                this.IsDirty = true;
            }
        }
        #endregion

        #region Version
        public int Version
        {
            get
            {
                return _dataRow["Version"] == Convert.DBNull ? -1 : Convert.ToInt32(_dataRow["Version"]);
            }
            set
            {
                _dataRow["Version"] = value;
                this.IsDirty = true;
            }
        }
        #endregion

        #region Gebruikers
        private User _gebruikers;
        public User Gebruikers
        {
            get
            {
                if (_gebruikers == null && _luw.CanLoad && this.CanLoad)
                {
                    System.Data.DataTable table = BeeldBank.Data.User.Open(UserId);
                    if (table.Rows.Count == 1)
                    {
                        _gebruikers = _luw.NewUser(table.Rows[0]);
                    }
                }
                return _gebruikers;
            }
        }
        #endregion

        #region ContentChanged
        /// <summary>
        /// ContentChanged
        /// This function checks whether the content of a record is changed, dependant on the "EnforceSave" 
        /// variable. If EnforceSave is false, all the fields which have not been marked "NOTENFORCINGSAVE" as
        /// a stereotype in the design are checked. The contents of the fields are checked against the old values
        /// if they are not equal,the result is true. If the contents are equal, the result is false.
        /// 
        /// If EnforceSave is true, the result is always true.
        /// </summary>
        /// <returns>boolean indicating whether the Content is Changed</returns>
        public bool ContentChanged()
        {
            // Change enforced by Class Variables
            if (this.EnforceSave) { return (true); }
            if (this.IdIsNull) { return (true); }

            // Change enforced by the attributes

            #region Id
            /// Id is excluded because it is the primary key
            #endregion

            #region UserId

            if (this.UserIdIsNull != this.OldZoekActieLog.UserIdIsNull) { return (true); }
            if (this.UserId != this.OldZoekActieLog.UserId) { return (true); }

            #endregion

            #region ZoekDatum

            if (this.ZoekDatumIsNull != this.OldZoekActieLog.ZoekDatumIsNull) { return (true); }
            if (this.ZoekDatum != this.OldZoekActieLog.ZoekDatum) { return (true); }

            #endregion

            #region ZoekType

            if (this.ZoekTypeIsNull != this.OldZoekActieLog.ZoekTypeIsNull) { return (true); }
            if (this.ZoekType != this.OldZoekActieLog.ZoekType) { return (true); }

            #endregion

            #region ZoekThema

            if (this.ZoekThemaIsNull != this.OldZoekActieLog.ZoekThemaIsNull) { return (true); }
            if (this.ZoekThema != this.OldZoekActieLog.ZoekThema) { return (true); }

            #endregion

            #region AantalResultaten

            if (this.AantalResultatenIsNull != this.OldZoekActieLog.AantalResultatenIsNull) { return (true); }
            if (this.AantalResultaten != this.OldZoekActieLog.AantalResultaten) { return (true); }

            #endregion

            #region Begindatum

            if (this.BegindatumIsNull != this.OldZoekActieLog.BegindatumIsNull) { return (true); }
            if (this.Begindatum != this.OldZoekActieLog.Begindatum) { return (true); }

            #endregion

            #region Einddatum

            if (this.EinddatumIsNull != this.OldZoekActieLog.EinddatumIsNull) { return (true); }
            if (this.Einddatum != this.OldZoekActieLog.Einddatum) { return (true); }

            #endregion

            #region Criteria

            if (this.CriteriaIsNull != this.OldZoekActieLog.CriteriaIsNull) { return (true); }
            if (this.Criteria != this.OldZoekActieLog.Criteria) { return (true); }

            #endregion


            return false;
        }
        #endregion

        #region WhereAmI
        /// <summary>
        /// Provides the WhereAmI display text for a ZoekActieLog with the specified id
        /// </summary>
        /// <param name="id">Id of the ZoekActieLog.</param>
        /// <return>>WhereAmI display text</returns>
        public static string WhereAmI(int id)
        {
            string whereAmI = "";
            if (id == 0)
            {
                whereAmI = "New ZoekActieLog";
            }
            else
            {
                DataTable table = BeeldBank.Data.ZoekActieLog.Show(id);

            }
            return whereAmI;
        }
        #endregion

    }
}
